// capabilities 枚举
export enum Capabilities {
  VISION = 'vision',
  CHAT = 'chat',
  TEXT_EMBEDDING = 'text-embedding',
  SPEECH2TEXT = 'speech2text'
}

export interface LLMModel {
  id: string // 模型唯一标识符
  name: string // 模型调用名称
  title: string // 模型显示标题
  alias: string | null // 自定义别名
  desc: string | null // 模型描述
  logo: string | null // 模型logo图片URL
  vendor: string | null // 发行商/提供商
  releaseDate: string // 发行日期
  version: string | null // 模型版本

  maxInputTokens: number // 最大输入token数
  maxOutputTokens: number // 最大输出token数

  capabilities: Capabilities[] // 模型能力列表 例如视觉 [vision, chat, text-embedding, speech2text]

  level: number // 对应的vip级别 0 免费 1 专业 2 企业

  inputPrice: number // 对外输入价格 精确到每个token
  inputCost: number // 内部输入成本 精确到每个token
  outputPrice: number // 对外输出价格 精确到每个token
  outputCost: number // 内部输出成本 精确到每个token
  currency: string // 货币类型 例如 USD, CNY

  createdAt: string // 创建时间
  updatedAt: string // 更新时间
}

// 渠道
export interface ModelChannel {
  id: string // 唯一标识符
  desc: string // 描述
  apiEndpoint: string // API调用端点

  successTimes: number // 成功次数
  failedTimes: number // 失败次数

  lastUsedTime: string // 最后使用时间

  balance: number // key余额
  cost: number // key成本
  currency: string // key货币类型

  limit: string | null // 限制字符串 如 1小时允许3次 3/3600 默认为空 表示不限制

  createdAt: string // 创建时间
  updatedAt: string // 更新时间

  weight: number // 权重 渠道的权重逻辑,

  // 此key可用模型id
  availableModels: string[]
  isActive: boolean // 是否激活
}

// 渠道APIkey
export interface ModelChannelApiKey {
  id: number // 唯一标识符
  apiKey: string // APIKey
  weight: number // 权重
  limit: string | null // 限制字符串 如 1小时允许3次 3/3600 默认为空 表示不限制
  channelId: string // 渠道id

  createdAt: string // 创建时间
  updatedAt: string // 更新时间

  successTimes: number // 成功次数
  failedTimes: number // 失败次数
  isActive: boolean // 是否激活
}

/**
 * 模型渠道Token消耗记录表
 * 记录那个用户在哪个渠道使用哪个APIKey消耗了多少token
 */
export interface ModelChannelTokenCost {
  id: string // 唯一标识符
  modelId: string // 模型id
  channelId: string // 渠道id
  apiKeyId: string // APIKey id
  userId: string // 用户id

  
  isSuccess: number // 0 失败 1 成功 未成功不计费
  error: string | null // 错误信息
  
  inputTokens: number // 输入 token 数 未成功不计费 0
  inputCost: number // 输入成本 精确到每个token 未成功不计费 0
  outputTokens: number // 输出 token 数 未成功不计费 0
  outputCost: number // 输出成本 精确到每个token 未成功不计费 0
  costTime: number // 耗时 单位毫秒 未成功不计费 0  

  createdAt: string // 创建时间
}

// 模型参数
export interface LLMModelParams {
  key: string
  type: 'number' | 'string'
  default: any
  max: number // 如果是number类型，则表示最大值，如果是string类型，则表示最大长度
  min: number // 如果是number类型，则表示最小值，如果是string类型，则表示最小长度
  step: number | null // 如果是number类型，则表示步长，如果是string类型，则为空
}

// 以下是Ai助手相关模型
export interface AssistantCategory {
  id: string // 唯一标识符
  name: string // 名称
  desc: string | null // 描述
  avatar: string | null // 头像
}

/**
 * 助手模型
 *
 * 此表记录了 AI 助手的模型信息，包括模型标题、描述、关联的模型id、关联的模型名称等。
 */
export interface AgentAssistantModel {
  id: string // 模型唯一标识符
  title: string // 助手标题 如 Python代码优化
  desc: string | null // 助手描述 如 优化Python代码
  avatar: string | null // 助手头像 如 https://avatars.githubusercontent.com/u/1234567890?v=4
  modelId: string // 关联的模型id
  modelName: string // 关联的模型名称 对应 LLMModel 的 alias 别名 冗余
  categoryId: string // 关联的分类id
  categoryName: string // 关联的分类名称 冗余
  userId: string // 所属用户id
  userName: string // 所属用户名称 冗余
  userAvatar: string | null // 所属用户头像 冗余
  systemPrompt: string // 系统提示词

  /**
   * 以Json格式存储的参数
   * {"temperature": 0.1, "max_tokens": 1000, "top_p": 0.9, "frequency_penalty": 0.1, "presence_penalty": 0.1}
   */
  params: Record<string, any>
  plugins: string[] // 插件列表 里面是插件Key 如 ["pythonCode", "webSearch"]

  createdAt: string // 创建时间
  updatedAt: string // 更新时间
  lastUsedTime: string // 最后使用时间
}

/**
 * 助手历史版本表
 *
 * 此表记录了 AI 助手的模型历史版本信息，包括版本号、关联的助手、版本数据等。
 */
export interface AgentAssistantHistoryVersion {
  id: string // 模型版本唯一标识符
  assistantId: string // 关联的助手id
  version: number // 版本号 1 每次发布新版本，版本号加1
  data: string // 模型版本数据 以Json格式存储AgentAssistantModel全部数据
}

/**
 * 助手对话会话
 *
 * 此表记录了用户与 AI 助手的对话会话信息，包括会话的标题、描述、关联的助手和用户等。
 */
export interface AgentAssistantSession {
  id: string // 会话唯一标识符
  title: string // 会话标题
  desc: string | null // 会话描述
  assistantId: string // 关联的助手id
  userId: string // 关联的用户id
  userName: string // 关联的用户名称 冗余
  userAvatar: string | null // 关联的用户头像 冗余
  data: string // 会话数据 以Json格式存储会话数据
  createdAt: string // 创建时间
  updatedAt: string // 更新时间
}

/**
 * MessageGroup 表示一次完整的对话交互
 *
 * 特点：
 * 1. 每个 group 至少包含两个 message：一个来自用户，一个来自 AI 助手
 * 2. 支持多版本对话：当用户要求 AI 重新回答或编辑已发送的消息时，会生成新的 message 版本
 *
 * 查询和处理逻辑：
 * 1. 通过 sessionId 获取该会话的所有 MessageGroup
 * 2. 对每个 MessageGroup，获取其所有相关的 Message
 * 3. 将 Message 按照 version 和 type 进行排序
 * 4. 处理排序后的 Message：
 *    a. 按版本分组
 *    b. 在每个版本内，按用户和助手的对话顺序排列
 *
 * 场景处理：
 * 1. 用户要求 AI 重新回答：
 *    - 生成新的 assistant message，版本号加 1
 *    - 永远使用 version 为 最大的 user message
 *
 * 2. 用户编辑已发送的消息：
 *    - 创建新的 MessageGroup
 *    - 在新 group 中创建新的 user message，版本号为 1
 *    - AI 重新生成回答，创建新的 assistant message，版本号为 1
 *
 * 数据结构示例：
 *
 * 原始数据：
 * {
 *   id: "group1",
 *   sessionId: "session1",
 *   messages: [
 *     { id: "msg1", type: "user", content: "你好", version: 1 },
 *     { id: "msg2", type: "assistant", content: "你好！有什么可以帮助你的吗？", version: 1 },
 *     { id: "msg3", type: "assistant", content: "嗨，很高兴见到你！请问有什么我可以为你效劳的吗？", version: 2 }
 *   ]
 * }
 *
 * 处理后的数据：
 * {
 *   id: "group1",
 *   sessionId: "session1",
 *   versions: [
 *     {
 *       version: 1,
 *       messages: [
 *         { id: "msg1", type: "user", content: "你好" },
 *         { id: "msg2", type: "assistant", content: "你好！有什么可以帮助你的吗？" }
 *       ]
 *     },
 *     {
 *       version: 2,
 *       messages: [
 *         { id: "msg1", type: "user", content: "你好" },
 *         { id: "msg3", type: "assistant", content: "嗨，很高兴见到你！请问有什么我可以为你效劳的吗？" }
 *       ]
 *     }
 *   ]
 * }
 *
 * 注意：
 * 1. 在处理后的数据中，每个版本都包含完整的对话，包括用户消息和助手回复
 * 2. 当生成新版本时，会复用上一版本的用户消息，确保上下文的连贯性
 * 3. 对于用户编辑消息的情况，应创建新的 MessageGroup，而不是在原 group 中添加新版本
 */
export interface AgentAssistantSessionMessageGroup {
  id: string // 会话消息组唯一标识符
  sessionId: string // 关联的会话id
  userId: string // 关联的用户id
  createdAt: string // 创建时间
  updatedAt: string // 更新时间

  //本次对话的消耗
  inputTokens: number
  outputTokens: number
  costTime: number // 耗时 单位毫秒

  // 使用模型 当前对话使用的模型
  modelId: string // 关联的模型id
  modelName: string // 关联的模型名称

}

/**
 * 对话消息
 *
 * 此表记录了对话消息的详细信息，包括消息内容、类型、版本等。
 */
export interface AgentAssistantSessionMessage {
  id: string // 会话消息唯一标识符
  groupId: string // 关联的会话消息组id
  sessionId: string // 关联的会话id
  userId: string // 关联的用户id
  content: string // 会话消息内容
  files: string[] // 会话消息文件列表 里面是id
  images: string[] // 会话消息图片列表 里面是id
  audio: string | null // 会话消息音频文件路径 里面是id
  data: string | null // 只有当type为card时，data为json格式存储卡片数据
  type: 'user' | 'assistant' | 'system' | 'card' // 消息类型
  version: number // 消息版本

  createdAt: string // 创建时间
  updatedAt: string // 更新时间
}

/**
 * 对话消息文件
 *
 * 此表记录了对话消息中使用的文件信息，包括文件的名称、大小、类型、MIME类型、扩展名等。
 */
export interface AgentAssistantSessionMessageFile {
  id: string // 文件唯一标识符
  name: string // 文件名称
  size: number // 文件大小（字节）
  type: FileType // 文件类型枚举
  mime: string // 文件MIME类型
  extension: string // 文件扩展名
  hash: string // 文件哈希值（如MD5或SHA-256）

  path: string // 服务器存储地址
  previewUrl: string | null // 文件预览地址（如果可用）
  thumbnailUrl: string | null // 缩略图地址（适用于图片和视频）

  metadata: Record<string, any> // 额外的元数据，可存储任意信息

  uploadedBy: string // 上传者ID
  createdAt: string // 创建时间
  updatedAt: string // 更新时间

  retentionDays: number // 文件保留天数 0表示永久保留
}

/**
 * 文件类型枚举
 */
export enum FileType {
  IMAGE = 'image',
  AUDIO = 'audio',
  VIDEO = 'video',
  DOCUMENT = 'document',
  ARCHIVE = 'archive',
  OTHER = 'other'
}

/**
 * 对话消息分享
 *
 * 此表记录了用户分享对话消息的信息，包括分享的助手、助手的名称、助手的头像、助手的描述等。
 */
export interface AgentAssistantMessageShare {
  id: string // 对话消息分享唯一标识符
  userId: string // 谁分享的
  userName: string // 分享者的用户名
  userAvatar: string | null // 分享者的头像

  assistantId: string // 关联的助手id
  assistantName: string // 助手的名称
  assistantAvatar: string | null // 助手的头像
  assistantDesc: string | null // 助手的描述

  groupNum: number // 包含几条Group
  messageNum: number // 包含几条Message

  /**
   * 一个Json 里面包含了选中的Group的原始DB数据的Json
   * [
   *  {
   *      id: "group1",
   *      sessionId: "session1",
   *      messages: [
   *          { id: "msg1", type: "user", content: "你好", version: 1 },
   *      ]
   *  }
   * ]
   */
  shareData: string // 一个Json 里面包含了选中的Group的原始DB数据的Json

  createdAt: string // 创建时间
  updatedAt: string // 更新时间
  status: number // 状态 0 未审核 1 已审核 2 违规状态 默认0
  reason: string | null // 违规理由 默认null

  viewCount: number // 浏览次数 默认0
}

/**
 * 分享信息的浏览记录表
 *
 * 此表记录了所有浏览分享信息的用户ip和时间，用于统计分享信息的热度，到时候可以按热度排序弄排行榜
 */
export interface AgentAssistantMessageShareView {
  id: string // 分享信息浏览记录唯一标识符
  shareId: string // 关联的分享id
  ip: string // 浏览者的ip
  createdAt: string // 创建时间
}

/**
 * 对话插件表
 *
 * 此表存储了对话系统中使用的各种插件信息。
 * 插件可以扩展对话系统的功能，例如网络搜索、天气查询等。
 * 每个插件都有唯一的标识符、别名、名称、描述等基本信息。
 * 同时还包含了插件的OpenAPI schema、认证方式等技术细节。
 */
export interface AgentAssistantApiPlugin {
  id: string // 插件唯一标识符
  alias: string // 插件别名 独一无二的 如 webSearch
  name: string // 插件名称
  desc: string | null // 插件描述
  avatar: string | null // 插件头像

  rawSchema: string // 原始schema 以Json格式存储的OpenAPI schema

  // 以下是 schema 中解析出来的基础谢谢

  // 鉴权
  authType: 'basic' | 'bearer' | 'custom'
  authKey: string | null // 鉴权key 如 Authorization
  authValue: string | null // 鉴权值 如 basic auth的username:password 或 bearer token 或 custom的值

  // 请求地址
  baseUrl: string

  createdAt: string // 创建时间
  updatedAt: string // 更新时间
}

/**
 * 插件调用表
 *
 * 此表记录了插件的调用信息，包括调用时的请求参数、响应结果等。
 */
export interface AgentAssistantApiPluginCall {
  id: string // 插件调用唯一标识符
  pluginId: string // 关联的插件id
  name: string // 插件名称
  desc: string | null // 插件描述

  // 请求相关
  endpoint: string
  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'
  parameters: string // 插件调用参数 符合OpenAPI schema的格式存储

  // 鉴权
  authType: 'basic' | 'bearer' | 'custom'
  authKey: string | null // 鉴权key 如 Authorization
  authValue: string | null // 鉴权值 如 basic auth的username:password 或 bearer token 或 custom的值

  createdAt: string // 创建时间
}

// 调用记录表 区分调试调用与正式调用
export interface AgentAssistantApiPluginCallRecord {
  id: string // 调用记录唯一标识符
  pluginId: string // 关联的插件id
  callId: string // 关联的插件调用id
  userId: string // 关联的用户id
  type: 'debug' | 'official' // 调用类型 调试调用 或 正式调用

  endpoint: string // 请求地址
  method: 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' // 请求方法
  parameters: string // 请求参数 以Json格式存储
  headers: string // 请求头 以Json格式存储

  // 调用结果
  status: number // 调用状态 0 未完成 1 已完成 2 失败
  responseStatus: number // 调用响应状态码
  response: string | null // 调用响应 以Json格式存储
  error: string | null // 调用错误信息
  cost: number // 调用消耗时间 单位毫秒

  createdAt: string // 创建时间
  updatedAt: string // 更新时间

  assistantId: string | null // 关联的助手id，如果是通过助手调用的插件
  sessionId: string | null // 关联的会话id，如果是在会话中调用的插件
}

/**
 * token 消耗记录表
 *
 * 此表记录了 token 的消耗信息，包括输入 token 数、输出 token 数、消耗时间等。
 */
export interface AgentAssistantSessionTokenCost {
  id: string // 消耗记录唯一标识符
  assistantId: string // 关联的助手id
  sessionId: string // 关联的会话id
  groupId: string // 关联的会话消息组id
  
  // 使用模型
  modelId: string // 关联的模型id
  modelName: string // 关联的模型名称

  inputTokens: number // 输入 token 数
  outputTokens: number // 输出 token 数
  costTime: number // 耗时 单位毫秒
  
  createdAt: string // 创建时间
}
